import java.util.ArrayList;

public class Poker {
	private int Color;
	private int Number;
	static final int Pai=13;
	static final int Hua=4;
	static final int Shun=5;
	public Poker(int color, int number){
		Color=color;
		Number=number;
	}
	public Poker(int hash){
		Color=hash/Pai;
		Number=hash%Pai;
	}
	public int getInt(){
		return Color*Pai+Number;
	}
	public int getColor(){
		return Color;
	}
	public int getNumber(){
		return Number;
	}
	public Poker[] sort(Poker[] p){
		//冒泡排序
		for(int i=0;i<p.length;i++){
			for(int j=i+1;j<p.length;j++){
				if(p[j].getInt()<p[i].getInt()){
					Poker temp=p[j];
					p[j]=p[i];
					p[i]=temp;
				}
			}
		}
		return p;
	}
	public Poker[] sortByColor(Poker[] p){
		//冒泡排序
		for(int i=0;i<p.length;i++){
			for(int j=i+1;j<p.length;j++){
				if(p[j].getColor()<p[i].getColor()){
					Poker temp=p[j];
					p[j]=p[i];
					p[i]=temp;
				}else if(p[j].getColor()==p[i].getColor()&&p[j].getNumber()<p[i].getNumber()){
					Poker temp=p[j];
					p[j]=p[i];
					p[i]=temp;
				}
			}
		}
		return p;
	}
	public Poker[] sortByNumber(Poker[] p){
		for(int i=0;i<p.length;i++){
			for(int j=i+1;j<p.length;j++){
				if(p[j].getNumber()<p[i].getNumber()){
					Poker temp=p[j];
					p[j]=p[i];
					p[i]=temp;
				}else if(p[j].getColor()<p[i].getColor()&&p[j].getNumber()==p[i].getNumber()){
					Poker temp=p[j];
					p[j]=p[i];
					p[i]=temp;
				}
			}
		}
		return p;
	}
	public static Boolean isTonghuashun(Poker[] p){
		//判断花色，
		int[] Color=new int[Hua];
		for(int i=0;i<p.length;i++){
			Color[p[i].getColor()]++;

		}
		for(int i=0;i<Hua;i++){
			if(Color[i]>=5){
				//此时判断是否同花顺
				int[] Number=new int[Pai];
				for(int j=0;j<p.length;j++){
					if(p[j].getColor()==i){
						Number[p[j].getNumber()]++;
					}
				}
				if(Number[9]>0&&Number[10]>0&&Number[11]>0&&Number[12]>0&&Number[0]>0){
					return true;
				}
				for(int j=0;j<Pai-Shun+1;j++){
					if(Number[j]>0&&Number[j+1]>0&&Number[j+2]>0&&Number[j+3]>0&&Number[j+4]>0){
						return true;
					}
				}
			}
		}
		return false;
	}
	//done
	public static Boolean isSitiao(Poker[] p){
		int Number[]=new int[Pai];
		for(int i=0;i<p.length;i++){
			Number[p[i].Number]++;
			if(Number[p[i].Number]==Hua){
				return true;
			}
		}
		return false;
	}
	//done
	public static Boolean isHulu(Poker[] p){
		int Number[]=new int[Pai];
		for(int i=0;i<p.length;i++){
			Number[p[i].Number]++;
		}
		for(int i=0;i<Pai;i++){
			if(Number[i]==3){
				for(int j=0;j<Pai;j++){
					if(i==j){
						continue;
					}
					if(Number[j]==2||Number[j]==3){
						return true;
					}
				}
			}
		}
		
		return false;
	}
	//done
	public static Boolean isTonghua(Poker[] p){
		if(isTonghuashun(p)){
			return false;
		}
		//判断花色，
		int[] Color=new int[Hua];
		for(int i=0;i<p.length;i++){
			Color[p[i].getColor()]++;
			if(Color[p[i].getColor()]>=5){
				return true;
			}
		}
		return false;
	}
	public static Boolean isShun(Poker[] p){
		if(isTonghuashun(p)){
			return false;
		}
		int Number[]=new int[Pai];
		for(int i=0;i<p.length;i++){
			Number[p[i].Number]++;
		}
		for(int i=0;i<Pai-Shun+1;i++){
			if(Number[i]>0&&Number[i+1]>0&&Number[i+2]>0&&Number[i+3]>0&&Number[i+4]>0){
				return true;
			}
		}
		if(Number[9]>0&&Number[10]>0&&Number[11]>0&&Number[12]>0&&Number[0]>0){
			return true;
		}
		return false;
	}
	//三条必须是一个三张，其他都是散牌
	//done
	public static Boolean isSantiao(Poker[] p){
		int Number[]=new int[Pai];
		for(int i=0;i<p.length;i++){
			Number[p[i].Number]++;
		}
		for(int i=0;i<Pai;i++){
			if(Number[i]==3){
				for(int j=0;j<Pai;j++){
					if(i==j){
						continue;
					}
					if(Number[j]>1){
						return false;
					}
				}
				return true;
			}
		}
		return false;
	}
	//可以是三对
	public static Boolean isLiangdui(Poker[] p){
		if(isHulu(p)){
			return false;
		}
		int Number[]=new int[Pai];
		for(int i=0;i<p.length;i++){
			Number[p[i].Number]++;
		}
		for(int i=0;i<Pai;i++){
			if(Number[i]>2){
				return false;
			}
		}
		for(int i=0;i<Pai;i++){
			if(Number[i]==2){
				for(int j=0;j<Pai;j++){
					if(i==j){
						continue;
					}
					if(Number[j]==2){
						return true;
					}
				}
			}
		}
		return false;
	}
	public static Boolean isDui(Poker[] p){
		int Number[]=new int[Pai];
		for(int i=0;i<p.length;i++){
			Number[p[i].Number]++;
		}
		for(int i=0;i<Pai;i++){
			if(Number[i]==2){
				for(int j=0;j<Pai;j++){
					if(i==j){
						continue;
					}
					if(Number[j]>1){
						return false;
					}
				}
				return true;
			}
		}
		return false;
	}
	static final int SANPAI=0;
	static final int DUI=1;
	static final int LIANGDUI=2;
	static final int SANTIAO=3;
	static final int SHUN=4;
	static final int TONGHUA=5;
	static final int HULU=6;
	static final int SITIAO=7;
	static final int TONGHUASHUN=8;
	
	public static int type(Poker[] p){
		if (isTonghuashun(p)){
			return TONGHUASHUN;
		}
		if(isSitiao(p)){
			return SITIAO;
		}
		if(isHulu(p)){
			return HULU;
		}
		if(isTonghua(p)){
			return TONGHUA;
		}
		if(isShun(p)){
			return SHUN;
		}
		if(isSantiao(p)){
			return SANTIAO;
		}
		if(isLiangdui(p)){
			return LIANGDUI;
		}
		if(isDui(p)){
			return DUI;
		}
		return SANPAI;
	}
}
